// 定义一个myCall方法，用于模拟Function.prototype.call方法
Function.prototype.myCall = function (context, ...args) {
  // 如果context为null或undefined，则将context设置为全局对象globalThis
  context =
    context === null || context === void 0 ? globalThis : Object(context);
  // 定义一个唯一的key，用于将函数绑定到context对象上
  const key = Symbol("temp");
  // 将函数绑定到context对象上，并设置不可枚举
  Object.defineProperty(context, key, {
    enumerable: false,
    value: this,
  });
  // 调用函数，并传入参数
  const result = context[key](...args);
  // 删除context对象上的函数
  delete context[key];
  // 返回函数执行结果
  return result;
};

Function.prototype.myApply = function (context, arr) {
  // 如果context为null或undefined，则将context设置为全局对象globalThis
  context =
    context === null || context === void 0 ? globalThis : Object(context);
  // 定义一个唯一的key，用于将函数绑定到context对象上
  const key = Symbol("temp");
  // 将函数绑定到context对象上，并设置不可枚举
  Object.defineProperty(context, key, {
    enumerable: false,
    value: this,
  });
  // 调用函数，并传入参数
  const result = context[key](...arr);
  // 删除context对象上的函数
  delete context[key];
  // 返回函数执行结果
  return result;
};

Function.prototype.myBind = function (context, ...args) {
  const fn = this;
  return function (...rest) {
    return fn.apply(context, args.concat(rest));
  };
};
